package ec.edu.ucacue.siop.procesoNegocio.iniciar.variables;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.StringTokenizer;

import org.hibernate.Session;

import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import ec.edu.ucacue.siop.dao.historico.HistoriaVariablesProcesoDAO;
import ec.edu.ucacue.siop.dao.historico.HistoriaVariablesProcesoDAOImpl;
import ec.edu.ucacue.siop.dao.recurso.VariableProcesoDAO;
import ec.edu.ucacue.siop.dao.recurso.VariableProcesoDAOImpl;
import ec.edu.ucacue.siop.modelo.operacion.historico.HistoriaVariablesProceso;
import ec.edu.ucacue.siop.modelo.recurso.VariableProceso;
import ec.edu.ucacue.siop.utilidades.HibernateUtil;

public class CargaVariables {

	private List<ContVariableProceso> listaVariable = new ArrayList<ContVariableProceso>();
	String razon;
	
	public List<ContVariableProceso> getListaVariable() {
		return listaVariable;
	}

	public void setListaVariable(List<ContVariableProceso> listaVariable) {
		this.listaVariable = listaVariable;
	}

	public String getRazon() {
		return razon;
	}

	public void setRazon(String razon) {
		this.razon = razon;
	}

	public boolean leer(String directorio,int year){
		int[] indice = new int[80];
		File direct = new File(directorio);
		String[] listadoArchivos = direct.list();
		Calendar fecha;
		if(!direct.exists()){
			razon = "Directorio no existe";
			return false;
		}
		ordenar(listadoArchivos);
		
		Workbook tablaEquiv;
		File tabla = new File(directorio+"/0tablaRelacion.xls");
		try {
			tablaEquiv = Workbook.getWorkbook(tabla);
			Sheet hoja = tablaEquiv.getSheet(0);
			int indMax = 0;
			for(int i=3; i<hoja.getRows();i++){
				int index = Integer.parseInt(hoja.getCell(4, i).getContents());
				int subIndice;
				
				if(hoja.getCell(5, i).getContents().length()==2) {
					subIndice = Integer.parseInt(hoja.getCell(5, i).getContents());
					indice[subIndice] = index;
					if(indMax < subIndice) indMax = subIndice;
				}
			}

			//
			// Carga de las variables listadoArchivos.length
			
			for(int i=1;i<listadoArchivos.length;i++){
				File archivo = new File(directorio+"/"+listadoArchivos[i]);
				
				StringTokenizer nomArc = new StringTokenizer(listadoArchivos[i],".");
				StringTokenizer nomArchivo = new StringTokenizer(nomArc.nextToken(),"_");
				String valor = nomArchivo.nextToken();
				int mes = Integer.parseInt(nomArchivo.nextToken());
				int indVar = Integer.parseInt(nomArchivo.nextToken());

				
				Workbook datos = Workbook.getWorkbook(archivo);
				Sheet hojaDatos = datos.getSheet(0);
				for(int iCol=0; iCol<hojaDatos.getColumns(); iCol++){
					for(int iFil =0; iFil<hojaDatos.getRows();iFil++){
						String valStr = hojaDatos.getCell(iCol, iFil).getContents();
						if(valStr.length()>0){
							ContVariableProceso nueva = new ContVariableProceso();
							nueva.setIndVar(indice[indVar]);
							Calendar fec = Calendar.getInstance();
							fec.set(year, mes-1, iCol+1, iFil, 0);
							nueva.setFecha(fec);
							valStr = valStr.replace(",", ".");
							float valorF = Float.parseFloat(valStr);
							nueva.setValor(valorF);
							listaVariable.add(nueva);
						}
					}
				}
			}
			Collections.sort(listaVariable, new Comparator<ContVariableProceso>() {
				public int compare(ContVariableProceso var1, ContVariableProceso var2) {
					if(var1.getFecha().before(var2.getFecha()) ) {
						return -1;
					}
					else {
						return 1;
					}
				}
			});
			
		} catch (BiffException e) {
			// TODO Bloque catch generado automáticamente
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Bloque catch generado automáticamente
			e.printStackTrace();
		}
		
		
		return true;
		
	}

	private void ordenar(String[] listadoArchivos) {
		for(int i= 0;i<listadoArchivos.length -1; i++) {
			for (int j=i+1;j<listadoArchivos.length; j++) {
				if(listadoArchivos[i].compareTo(listadoArchivos[j]) > 0 ){
					String temp = listadoArchivos[i];
					listadoArchivos[i] = listadoArchivos[j];
					listadoArchivos[j] = temp;
				}
			}
		}
	}

	public void almacenar() {
		Session ses = HibernateUtil.beginTransaction();
		VariableProcesoDAO vpDao = new VariableProcesoDAOImpl();
		List<VariableProceso> listaVP = vpDao.findAll(VariableProceso.class);
		HistoriaVariablesProcesoDAO hvpDao = new HistoriaVariablesProcesoDAOImpl();
		for(int i=0; i<listaVariable.size(); i++){
			HistoriaVariablesProceso hist = hvpDao.create(listaVP.get((int)listaVariable.get(i).getIndVar()-1), listaVariable.get(i).getValor(), listaVariable.get(i).getFecha());
			hvpDao.save(hist);
		}
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		
	}
	
}
